﻿#ifndef EXPRTKHELPER_H
#define EXPRTKHELPER_H

#include <QObject>
#include "SINGLETON_MACRO.h"

#include "exprtk.hpp"

#include <QDebug>

class ExprtkHelper
{
    DECLARE_SINGLETON(ExprtkHelper);

public:
    /**
     * @brief execute       根据公式和输入数据计算结果
     * @param formula       公式
     * @param inputValue    输入数据
     * @param outputValue   输出结果
     * @return 是否成功
     */
    template <typename T>
    bool execute(const std::string& formula, const T& inputValue, QVariant& outputValue)
    {
        typedef exprtk::symbol_table<T> symbol_table_t;
        typedef exprtk::expression<T>   expression_t;
        typedef exprtk::parser<T>       parser_t;

        const std::string expression_string = formula;

        T x;

        symbol_table_t symbol_table;
        symbol_table.add_variable("x", x);
        symbol_table.add_constants();

        expression_t expression;
        expression.register_symbol_table(symbol_table);

        parser_t parser;
        parser.compile(expression_string,expression);

        x = inputValue;
        const T y = expression.value();

        // qDebug() << QString::asprintf("%19.15f\t%19.15f", x, y);

        outputValue = y;

        return true;
    }

};

#endif // EXPRTKHELPER_H
